﻿package fwk.siteManager2 {	

	import flash.display.MovieClip;
	import flash.events.Event;
	import fwk.siteManager2.interfaces.IDisplayElement;
	import fwk.siteManager2.events.ContainerLoaderEvent;
	import fwk.siteManager2.events.TemplateEvent;
	import fwk.siteManager2.interfaces.ITemplate;
	
	

	/**
	 * Cette classe représente un element affichable qu'un template mère (Template) peut contrôler.
	 * Vous ne pouvez pas instancier cette classe directement, votre élément doit hérité de cette Classe.
	 */
	public class DisplayElement extends MovieClip implements IDisplayElement
	{
		
		///////////////////////////
		// private properties
		private var _uiElement:String 		= "";
		private var _xmlConfig:XML;
		private var _xmlContent:XML;
		
		private var _template:ITemplate;


		/**
		 * identifiant du displayElement
		 */
		public function get uiElement():String
		{
			return _uiElement;
		}
		
		
		public function get xmlConfig():XML
		{
			return _xmlConfig;
		}
		public function get xmlContent():XML
		{
			return _xmlContent;
		}
		
		/**
		 * ITemplate correspondant au template mère auquel ce displayElement appartient. Vous pouvez acceder à ce template pour récupéré ses ressources.
		 */
		public function get template():ITemplate { return _template; }
		
		public function set template(value:ITemplate):void 
		{
			_template = value;
		}
		
		
		//-----------------------------------------------------------------------
		// Constructeur
		//-----------------------------------------------------------------------
		function DisplayElement ():void
		{

			
		}
		
		//-----------------------------------------------------------------------
		// Methodes
		//-----------------------------------------------------------------------
		public final function _init(ui:String, xmlConfig:XML = null, xmlContent:XML = null):void
		{	
			_uiElement		= ui;
			_xmlConfig		= xmlConfig;
			_xmlContent		= xmlContent;
			

			
		}
		/**
		 * Initilise l'element de page.  Cette méthode est appelé par le template mère automatiquement quand une nouvelle page est créé et affichée. Vous pouvez redefinir cette méthode pour initialisé ce qui est spécifique à votre élement.
		 * Appelé une seule fois par instance (ce qui signifie que si les ressources ont été ajouté en cache avec la méthode du MainBase addToCacheStatic, cette méthode sera appélé qu'une fois).
		 */
		public function init():void
		{

		}
		/**
		 * Lance l'animation d'ouverture de l'élément de page. Cette méthode est appelé par le template mère automatiquement à chaque fois qu'une page est affichée. Vous pouvez redefinir cette méthode pour effectuer votre propre animation.
		 */
		public function display():void
		{
			//trace("---------- display Element ----------");
			this.alpha = 0;			
			
			App.mainClass.containerLoader.stage.addEventListener(Event.ENTER_FRAME, onEnterFrameAnimDisplay);
			function onEnterFrameAnimDisplay(evt:Event):void
			{
				alpha += 0.1;
				
				if ( alpha >= 1) {
					App.mainClass.containerLoader.stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameAnimDisplay);
				}
				
			}
			
		}
		/**
		 * Lance l'animation de fermeture de l'élément de page. Cette méthode est appelé par le template mère automatiquement quand une page nouvelle page doit être affichée. Vous pouvez redefinir cette méthode pour effectuer votre propre animation.
		 * Ne pas oublier d'appeler la méthode onCloseFinish quand votre animation est fini pour avertir le template mère que l'animation est fini.
		 */
		public function close():void
		{
			//trace("---------- close Element ----------");
			
			
			App.mainClass.containerLoader.stage.addEventListener(Event.ENTER_FRAME, onEnterFrameAnimClose);
			function onEnterFrameAnimClose(evt:Event):void
			{
				alpha -= 0.1;
				
				if ( alpha <= 0) {
					App.mainClass.containerLoader.stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameAnimClose);
					onCloseFinish();
				}
				
			}
			
			
		}
		
		/**
		 * Appelé cette méthode pour avertir que l'animation de fermeture de l'élément de page.
		 * note : Elle est automatiquement appelé si vous utilisé la méthode de base close
		 */
		public function onCloseFinish():void
		{
			//trace("---------- onCloseFinish Element ----------");
			
			dispatchEvent(new TemplateEvent(TemplateEvent.CLOSED));
			visible = false;
			alpha = 1;
		}
		/**
		 * Pour tuer la classe (vider la mémoire etc...)
		 */
		public function dispose():void
		{			
			
			_template = null;
			
		}
		/**
		 * Cette méthode est déclanché automatiquement dés qu'il y a un changement de deepLink. Vous pouvez la redefinir pour effectuer les actions que vous voulez dans votre element de page.
		 */
		public function onDeepLinkChange():void
		{
				
			
		}
	}
}